
// === uuType ===
// depend: uuMeta
/*
uuMeta.type(mix, match = 0x0) - return bool or matched bits
uuMeta.type.TYPES
uuMeta.type.NULL
uuMeta.type.UNDEF
uuMeta.type.HASH
uuMeta.type.ARRAY
uuMeta.type.BOOL
uuMeta.type.NUM
uuMeta.type.STR
uuMeta.type.FUNC
uuMeta.type.NODE
uuMeta.type.FAKE
 */
(function() {
var _type, // inner namespace
    _win = window,
    _doc = document;

// uuType - type detection
_type = function(mix,     // @param Mix:
                 match) { // @param Number(= 0x0): match types
                          // @return Boolean/Number: true = match,
                          //                         false = unmatch
                          //                         number is matched bits
  var undf,
      rv = (mix === null) ? _type.NULL
         : (mix === undf) ? _type.UNDEF
         : (mix === _win) ? _type.HASH // fix IE6 mem-leaks
         : (mix === _doc) ? _type.HASH // fix IE6 mem-leaks
         : (mix instanceof Array) ? _type.ARRAY
         : (_type.TYPES[typeof mix] || _type.HASH);

  if (rv === _type.HASH) {
    rv = mix.nodeType ? _type.NODE
                      : ("length" in mix) ? _type.FAKE
                                          : _type.HASH;
  }
  return match ? match & rv : rv;
};
// IE6 mem-leaks: (document instanceof Array),(window instanceof Array) is leaks

uuMeta.mix(_type, {
  TYPES: { // typeof hash
    "boolean":  0x010,
    "number":   0x020,
    "string":   0x040,
    "function": 0x080
  },
  // uuMeta.type.NULL
  NULL:  0x001, // null

  // uuMeta.type.UNDEF
  UNDEF: 0x002, // undefined

  // uuMeta.type.HASH
  HASH:  0x004, // Hash / Object / window / document

  // uuMeta.type.ARRAY
  ARRAY: 0x008, // Array

  // uuMeta.type.BOOL
  BOOL:  0x010, // Boolean

  // uuMeta.type.NUM
  NUM:   0x020, // Number

  // uuMeta.type.STR
  STR:   0x040, // String

  // uuMeta.type.FUNC
  FUNC:  0x080, // Function

  // uuMeta.type.NODE
  NODE:  0x100,

  // uuMeta.type.FAKE
  FAKE:  0x200  // FakeArray // "length" has collection (eg: NodeList)
});

// --- initialize ---

// --- export ---
uuMeta.type = _type; // uuMeta.type

})(); // uuType scope

